home *** CD-ROM | disk | FTP | other *** search
/ Openstep 4.2 (Developer) / Openstep Developer 4.2.iso / NextDeveloper / Source / GNU / perl / Perl / ext / SDBM_File / sdbm / hash.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-10-18  |  943 b   |  49 lines

  1. /*
  2.  * sdbm - ndbm work-alike hashed database library
  3.  * based on Per-Aake Larson's Dynamic Hashing algorithms. BIT 18 (1978).
  4.  * author: oz@nexus.yorku.ca
  5.  * status: public domain. keep it that way.
  6.  *
  7.  * hashing routine
  8.  */
  9.  
  10. #include "config.h"
  11. #include "sdbm.h"
  12. /*
  13.  * polynomial conversion ignoring overflows
  14.  * [this seems to work remarkably well, in fact better
  15.  * then the ndbm hash function. Replace at your own risk]
  16.  * use: 65599    nice.
  17.  *      65587   even better. 
  18.  */
  19. long
  20. sdbm_hash(str, len)
  21. register char *str;
  22. register int len;
  23. {
  24.     register unsigned long n = 0;
  25.  
  26. #ifdef DUFF
  27.  
  28. #define HASHC    n = *str++ + 65599 * n
  29.  
  30.     if (len > 0) {
  31.         register int loop = (len + 8 - 1) >> 3;
  32.  
  33.         switch(len & (8 - 1)) {
  34.         case 0:    do {
  35.             HASHC;    case 7:    HASHC;
  36.         case 6:    HASHC;    case 5:    HASHC;
  37.         case 4:    HASHC;    case 3:    HASHC;
  38.         case 2:    HASHC;    case 1:    HASHC;
  39.             } while (--loop);
  40.         }
  41.  
  42.     }
  43. #else
  44.     while (len--)
  45.         n = *str++ + 65599 * n;
  46. #endif
  47.     return n;
  48. }
  49.